/*
 * 関数の「mWebView.getSettings().setJavaScriptEnabled(true)
 * 」を改めて設置し、JavaScriptに支持される事。
 * 2013/12/23
 * */
package com.komeri.komeriapl;

import static com.komeri.komeriapl.Constants.*;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.j256.ormlite.dao.Dao;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.hardware.Camera;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.webkit.GeolocationPermissions.Callback;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.PopupWindow.OnDismissListener;
import android.widget.Toast;

/**
 * プログラムのトップページ
 * @author Liu Mingjia
 */
public class WebActivity extends Activity {
	
/** Log出力用のタグ */
private static final String TAG = WebActivity.class.getSimpleName();

/**
* Webオブジェクト
* */
private WebView mWebView;

/** プッシュ通知用 GCM登録クラス */
private GcmRegister gcmRegister;

/**
 * 戻るキーは２秒以内に二回クリックすると、プログラムを退出する
 * */
private long mPace = 0;

/** トップページのURL */
private static final String URL_TOP = "http://www.komeri.com/top/CKmSpSfAppTop2.jsp";

/** スキャンするコードの選択ページのURL */
private static final String URL_SCAN_SELECT = "http://www.komeri.com/top/CKmSpSfAppTop4.jsp";

/** search URL */
private static final String URL_SCAN_SEARCH = "http://www.komeri.com/top/CKmSpSfTop.jsp";

/**---<START 2014/10/10>---*/
/** screen width*/
private int screenWidth ;
/** navication button*/
private ImageButton etcBtn;
private boolean isBarcode = false;
private String scanResult = "";
/** database*/
private DataBaseHelper dbHelper;
private Dao<BarCodeInfo, String> barCodeInfoDao;
/**---<END 2014/10/10>---*/


	@Override
	protected void onCreate(Bundle savedInstanceState){
		Log.d(TAG, "onCreate");
		
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		init();
	}

	/**
	 * 初期化
	 * */
	public void init(){
		/**---<START 2014/10/10>---*/
		DisplayMetrics metric = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metric);
        screenWidth = metric.widthPixels; 
        //database
  		dbHelper = new DataBaseHelper(this);
  		try {
  			barCodeInfoDao = dbHelper.getBarCodeInfoDao();
  		} catch (SQLException e) {
  			// TODO Auto-generated catch block
  			e.printStackTrace();
  		}
		/**---<END 2014/10/10>---*/

		
  		
		webInit();
		
		gcmRegister = new GcmRegister(this);
		
		// 端末のGooglePlay開発者サービスアプリの確認
		if (gcmRegister.checkPlayServices()) {			
			// プッシュ通知の登録を行う
			gcmRegister.executeRegistration();		
		}
		
		
	}
	@Override	
	protected void onResume() {	
		Log.d(TAG, "onResume");
		
		this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
		super.onResume();
	}	
	
    /**
     * アクティビティが再利用されるときに呼び出される
     */
    @Override
    protected void onNewIntent(Intent intent) {
		Log.d(TAG, "onNewIntent");
    	super.onNewIntent(intent);       
    	
		// アプリ起動中に、プッシュ通知を開いたことによるアプリ起動をした場合に呼ばれる
    	// プッシュ通知には、URLが設定されるケースがある
    	// そのため、インテントにURLが設定されている場合、そのページを表示する
    	loadUrlForIntent(intent);
    }
    
	/**
	 * Webオブジェクトを初期化する
	 * */
	@SuppressLint("NewApi")
	public void webInit(){

		mWebView = (WebView)findViewById(R.id.WebView_ID);
		//ログインフォームのデータを保存しない
		mWebView.getSettings().setSaveFormData(false); 
		//暗証番号を保存しない
		mWebView.getSettings().setSavePassword(false); 
		
		mWebView.getSettings().setLoadWithOverviewMode(true);
		
		mWebView.getSettings().setJavaScriptEnabled(true);
		
		//Geolocation（位置情報取得）を有効にする
		mWebView.getSettings().setGeolocationEnabled(true);
		
		mWebView.getSettings().setUseWideViewPort(true);
		
		//ピンチイン、ピンチアウト（拡大・縮小）を有効にする
		mWebView.getSettings().setBuiltInZoomControls(true);
		
		//ページの表示
		//アプリ初回起動時と、アプリ未起動時にプッシュ通知を開いたことによる起動で表示するページを切り替える
    	//プッシュ通知には、URLが設定されるケースがある
    	//そのため、インテントにURLが設定されている場合、そのページを表示する
		loadUrlForIntent(getIntent());
		
		//Webビューのクライアントを設置する
		mWebView.setWebViewClient(new MyWebViewClient());
		//webロードのプロセス
		mWebView.setWebChromeClient(new WebChromeClient(){
			@Override
			public void onProgressChanged(WebView view, int newProgress){
				
				super.onProgressChanged(view, newProgress);
			}
			
			/**
			 * Geolocation APIを使用した位置情報へのアクセスを許可する
			 */
		   	@Override
		   	public void onGeolocationPermissionsShowPrompt(String origin, Callback callback) {
		   		callback.invoke(origin, true, false);
		   	}
		});
		
		//アプリ独自のuser-agentを設定する
		setCustomUserAgent();
		
		etcBtn = (ImageButton)findViewById(R.id.IB_barcode_ID);
		mWebView.setWebChromeClient(wvcc);
	}
	
	public void onClickButton(View v){
			
		switch(v.getId()){
			
		//ホームページ
		case R.id.IB_home_ID:
			
			mWebView.loadUrl(URL_TOP);
		
			break;
		//戻る
		case R.id.IB_back_ID:
				
			mWebView.goBack();
				
			break;
		//進む
		case R.id.IB_search_ID:
				
			mWebView.loadUrl(URL_SCAN_SEARCH);
			
			break;
		//リフレッシュ
		case R.id.IB_renovate_ID:
				
			mWebView.reload();
			
			break;
		//スキャンするコードの選択ページ
		case R.id.IB_barcode_ID:
			/**---<START 2014/10/10>---*/
			//show navigation window
			PopupWindow pop = getNavigationWindow(WebActivity.this) ;
			pop.showAtLocation(mWebView, Gravity.BOTTOM|Gravity.RIGHT, 0, 0);	
			/**---<END 2014/10/10>---*/
							
			break;
		}
	}
	
	/**
	 * [バーコード検索]画面に遷移する
	 * */
	public void openCamera(BarCodeType barCodeType){
		
		int numberOfCameras = Camera.getNumberOfCameras();
		if (numberOfCameras > 0){
			//カメラが搭載されている場合
			Intent openCameraIntent = null;
			int sendValue = 0;
			
			switch (barCodeType) {
				case BARCODE:	//バーコード検索画面
					openCameraIntent = new Intent(WebActivity.this, BarCodeCaptureActivity.class);
					sendValue = BarCodeType.BARCODE.ordinal();
					openCameraIntent.putExtra(BaseCaptureActivity.INTENTS_KEY_BARCODE_TYPE, sendValue);
					
					break;
					
				case QRCODE:	//QRコードスキャン画面
					openCameraIntent = new Intent(WebActivity.this, QrCodeCaptureActivity.class);
					sendValue = BarCodeType.QRCODE.ordinal();
					openCameraIntent.putExtra(BaseCaptureActivity.INTENTS_KEY_BARCODE_TYPE, sendValue);
					
					break;
					
				default:
			}
			
			if (openCameraIntent != null) {
				startActivityForResult(openCameraIntent, OPEN_CAMERA_REQUEST);
			}
		}else{
			//カメラが搭載されていない場合、アラートを表示する
			CommonUtility.showAlert(this, R.string.camera_disable_alert, R.string.ok, 0, null, null);
		}
	}
	
	//閉じる
	public boolean onKeyDown(int keyCode,KeyEvent event){
			
	    if(keyCode==KeyEvent.KEYCODE_BACK){
	    	
	    		if((System.currentTimeMillis()-mPace)>2000){
	    			
		    		Toast.makeText(WebActivity.this, getString(R.string.app_close_message)
		    		        ,Toast.LENGTH_SHORT).show();
		    			
		    		mPace=System.currentTimeMillis();
		    			
		   		}else this.finish();
	    	
	   		return true;
	   	}
	   	return super.onKeyDown(keyCode, event);
	}
	/**
	 * 認識した情報をロードする
	 * JANコードと関連する商品ページにジャンプする
	 * @param requestCode
	 * @param resultCode
	 * @param intent
	 * */		
	@Override
	public void onActivityResult(int requestCode, int resultCode, Intent intent){
		if (requestCode == OPEN_CAMERA_REQUEST) {
			//　スキャン画面から戻った場合
			if (resultCode == RESULT_OK) {
				
				Bundle bundle = intent.getExtras();
				
				scanResult = bundle.getString("result");
				isBarcode = true;
				
				mWebView.loadUrl(scanResult);
			} 
		}
		else if (requestCode == PLAY_SERVICES_RESOLUTION_REQUEST) {
			// アプリ起動時のGooglePlay開発者サービス確認で
			// エラーを復旧させなかった場合、再度チェックを行い、エラーダイアログを表示する
			// エラーを復旧させた場合、プッシュ通知の登録を行う
			if (gcmRegister.checkPlayServices()) {
				gcmRegister.executeRegistration();
			}
		}
	}
	
	 
	    
		
	@Override
	public void onConfigurationChanged(Configuration newConfig) {
		super.onConfigurationChanged(newConfig);
		
		if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
			
			this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
			Log.e("onConfigurationChanged", "ORIENTATION_LANDSCAPE");
		}else{
			Log.e("onConfigurationChanged", "ORIENTATION_PORTRAIT");
		}
		
	}
    
   	/* ツールバーのボタンの状態を更新する */
	private void updateToolbarButton() {
   		//[戻る]ボタンの有効/無効を設定
    	//前のページに戻ることができれば有効、戻ることができなければ無効にする
   		ImageButton backBtn = (ImageButton)findViewById(R.id.IB_back_ID);
   		backBtn.setEnabled(mWebView.canGoBack() ? true : false);

   		//[進む]ボタンの有効/無効を設定
    	//次のページに進むことができれば有効、進むことができなければ無効にする
//   		ImageButton gotoBtn = (ImageButton)findViewById(R.id.IB_goto_ID);
//   		gotoBtn.setEnabled(mWebView.canGoForward() ? true : false);
    }
    
	/**
	 * アプリ独自のuser-agentを設定する
	 * HTML側で、ページを表示しているのがアプリか、ブラウザを判定するためにuser-agentを変更する
	 * */
    private void setCustomUserAgent() {
    	
    	//パッケージ名からアプリ名を取得
    	String appName = null;
		String packageName = this.getPackageName();
		String[] splitArray = packageName.split("\\.");	//"."（ピリオド）で分割する
		if(splitArray.length >= 3){
			appName = splitArray[2];
		}
		
		//既存のuser-agentの末尾に "　AppName/(アプリ名)" の文字列を追加する
		WebSettings webSettings = mWebView.getSettings();
		String customUserAgent = String.format("%s AppName/%s", webSettings.getUserAgentString(), appName);
		webSettings.setUserAgentString(customUserAgent);
    }
    
    /**
     * インテントによりロードするURLを切り替える
     * @param intent
     */
    private void loadUrlForIntent(Intent intent) {   	
		String urlString = intent.getStringExtra(URL_KEY);
		if (urlString == null) {
			// URLが存在しない場合は、通常のトップページを表示
			urlString = URL_TOP;
		}
		
		Log.i(TAG, "urlString = " + urlString);
		mWebView.loadUrl(urlString);
    }
    
	/**
	 * リクエスト内のリンクをクリックしてのみ、
	 * このメソッドをオーバーライドするために呼び出されるページ内にリンクをクリックするか、
	 * 現在のWebViewのジャンプとは、ブラウザ側にジャンプしなかったことにtrueを返します。
	 */
    public class MyWebViewClient extends WebViewClient{
	    	
	   	public boolean shouldOverviewUrlLoading(WebView view,String url){
	    		
	   		view.loadUrl(url);
	   		
	   		return true;
	   	}
	   	
	   	@Override
   		/* ページ読み込み開始 */
	   	public void onPageStarted(WebView view, String url, Bitmap favicon) {
	   		updateToolbarButton();
	   	}
	   	
	   	@Override
	   	/* ページ読み込み終了 */
	   	public void onPageFinished(WebView view, String url) {
	   		updateToolbarButton();
	   	}
	   	
	   	@Override
	   	/* ページ読み込み失敗 */
	   	public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
	   		updateToolbarButton();
	   	}
	   	
	   	@Override
	   	/* ページの読み込み前に呼ばれる */
	   	public boolean shouldOverrideUrlLoading(WebView view, String url) {
	   		
			String[] splitArray = url.split("://");		//URLを"://"で分割する
			if (splitArray.length >= 2) {
		   		if (splitArray[0].equals("komeriapl")) {
		   			// ブラウザからリクエストのあったURLのスキームが「komeriapl://」の場合
		   			// アプリで表示しているブラウザから、アプリの機能を実行する際は、以降に実装する
		   			
		   			if (splitArray[1].equals("barCodeScan")) {
		   				// バーコード検索画面に遷移する
				   		openCamera(BarCodeType.BARCODE);
			   		}
		   			else if (splitArray[1].equals("qrCodeScan")) {
		   				// QRコードスキャン画面に遷移する
				   		openCamera(BarCodeType.QRCODE);		   				
		   			}
		   			
			   		// ページ読み込み時のハンドリングをアプリで行う
			   		return true;
		   		}
			}
			
			// スキームが上記以外の場合は、ページ読み込み時のハンドリングは行わない
	   		return false;
		}
    }
    
    /**---<START 2014/10/10>---*/
  //get web title
    WebChromeClient wvcc = new WebChromeClient(){ 
	      @Override  
	      public void onReceivedTitle(WebView view, String title){ 
	        super.onReceivedTitle(view, title); 
	        if(isBarcode){
	        	isBarcode=false;
	        	String[] scan = scanResult.split("JAN_CD=");
	        	if(scan.length>1){
	        		String id = scan[1];
	        		try {
						List<BarCodeInfo> infoList = barCodeInfoDao.queryBuilder().orderBy("id", false).where().eq("barcode_id", id).query();
						if(infoList!=null&&infoList.size()>0){
							infoList.get(0).title = title;
							barCodeInfoDao.update(infoList.get(0));
						}
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
	        	}
	        }
	      } 
	  
	    }; 
    
    
    /**
     * PopupWindow of Navigation
     * @param ct
     * @return
     */
    public PopupWindow getNavigationWindow(final Context ct) {			
		View view = getLayoutInflater().inflate(R.layout.popupwindow_navigation ,null, false);		
	    ListView mListView = (ListView) view.findViewById(R.id.pop_age_listview );
	    final List<String> nameList = new ArrayList<String>();
	    nameList.add(""+ct.getResources().getString(R.string.navigation_name1));
	    nameList.add(""+ct.getResources().getString(R.string.navigation_name2));
	    nameList.add(""+ct.getResources().getString(R.string.navigation_name3));
	    nameList.add(""+ct.getResources().getString(R.string.navigation_name4));
	    nameList.add(""+ct.getResources().getString(R.string.navigation_name5));   
	    nameList.add(""+ct.getResources().getString(R.string.navigation_name6));
	    
	    final List<String> urlList1 = new ArrayList<String>();
	    urlList1.add(""+ct.getResources().getString(R.string.navigation_url1));
	    urlList1.add(""+ct.getResources().getString(R.string.navigation_url2));
	    urlList1.add(""+ct.getResources().getString(R.string.navigation_url3));
	    urlList1.add(""+ct.getResources().getString(R.string.navigation_url4));
	    urlList1.add(""+ct.getResources().getString(R.string.navigation_url5));
	    urlList1.add(""+ct.getResources().getString(R.string.navigation_url6));

	    TextAdapter adapter = new TextAdapter(ct,nameList);
	    mListView.setAdapter(adapter);
	    LinearLayout popupwindowLinear = (LinearLayout) view.findViewById(R.id.pop_age_linear);
//	    popupwindowLinear.setRight(screenWidth/10);
//        view.getBackground().setAlpha(99);      
        final PopupWindow popupWindow = new PopupWindow(view,LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
		popupWindow.setFocusable(true);		
		popupWindow.setOutsideTouchable(true);
		popupWindow.setBackgroundDrawable(new BitmapDrawable()); 
		popupWindow.setOnDismissListener(new OnDismissListener(){

			@Override
			public void onDismiss() {
				// TODO Auto-generated method stub
				etcBtn.setBackgroundDrawable(ct.getResources().getDrawable(R.drawable.home5_pressed));
			}
			
		});
		etcBtn.setBackgroundDrawable(ct.getResources().getDrawable(R.drawable.noicon));
		mListView.setOnItemClickListener(new OnItemClickListener(){

			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
					long arg3) {
				// TODO Auto-generated method stub
				if(arg2<urlList1.size()){
					mWebView.loadUrl(urlList1.get(arg2));
				}
				
				popupWindow.dismiss();
			}
			
		});
		popupwindowLinear.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				
				popupWindow.dismiss();
			}
			
		});
		
		return popupWindow;
	}
    
    /**
	* dp change to px
	*/
	public static int dip2px(Context context, float dpValue) {
	final float scale = context.getResources().getDisplayMetrics().density;
	return (int) (dpValue * scale + 0.5f);
	}

	/**
	*  px change to dp
	*/
	public static int px2dip(Context context, float pxValue) {
	final float scale = context.getResources().getDisplayMetrics().density;
	return (int) (pxValue / scale + 0.5f);
	}
    /**---<END 2014/10/10>---*/
    
    
    
}